/*
? 1. 创建空对象
? 2. 空对象的原型指向函数的原型
? 3. 空对象执行构造函数
? 4. 如果构造函数返回一个对象，则返回该对象；否则返回创建的新对象。
 */

function myNew(constructFn,...args) {
    //? 1.创建新对象(实例对象)
    let obj = {}
    //? 2.新对象的原型设置为构造函数的原型(类),使这个新对象可以继承指定对象的属性和方法，也可以自己定义新的属性和方法
    obj.__proto__ = constructFn.prototype
    //? 3.obj来执行构造函数 得到结果(如果构造函数中有return的话),此时由于obj执行了构造函数,相当于往构造函数中添加了属性
    const res = constructFn.apply(obj,args)
    //? 如果构造函数返回一个对象，则返回该对象；否则(没有返回值)返回创建的新对象(已添加构造函数中的操作)。
    return res instanceof Object ? res : obj
}
function Animal(name,age) {
    this.name = name;
    this.age = age
}
let animal = myNew(Animal, 'dog',23)
console.log(animal);
